iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0
Kubernetes

K8s 資料庫管理系統系列 第 11

day 11 k8s 學校ESG資料庫管理系統

  • 分享至 

  • xImage
  •  

今天是第十一天我們可以寫一個k8s 學校ESG資料庫管理系統,以下是程式碼

這個系統的主要功能可以包括:

  1. 資料庫管理(如:MySQL、PostgreSQL等)。
  2. API 後端服務,用於數據的操作(增刪改查)。
  3. 前端展示數據,提供學校、老師或學生對ESG數據的瀏覽、查詢功能。
  4. 使用K8s管理後端和前端的容器化應用。

以下是簡單的架構和Kubernetes設置方案:

1. 系統架構

後端:

  • 使用 Node.jsPython (Flask/Django) 開發API服務,提供ESG數據的增刪改查。
  • 使用 PostgreSQLMySQL 作為ESG數據庫。

前端:

  • 使用 React.jsVue.js 開發前端應用,通過API展示數據。

Kubernetes 元件:

  • Deployment 用於管理後端和前端應用的Pod。
  • Service 用於公開API與前端的訪問。
  • PersistentVolumePersistentVolumeClaim 用於存儲資料庫數據。
  • Ingress 用於公開外部HTTP/HTTPS流量。

2. Kubernetes 配置範例

1. 後端部署(假設使用Node.js)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: esg-backend
  labels:
    app: esg-backend
spec:
  replicas: 2
  selector:
    matchLabels:
      app: esg-backend
  template:
    metadata:
      labels:
        app: esg-backend
    spec:
      containers:
      - name: esg-backend
        image: your-dockerhub-account/esg-backend:latest
        ports:
        - containerPort: 3000
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: esg-db-secret
              key: database-url

2. 前端部署(假設使用React)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: esg-frontend
  labels:
    app: esg-frontend
spec:
  replicas: 2
  selector:
    matchLabels:
      app: esg-frontend
  template:
    metadata:
      labels:
        app: esg-frontend
    spec:
      containers:
      - name: esg-frontend
        image: your-dockerhub-account/esg-frontend:latest
        ports:
        - containerPort: 80

3. 資料庫部署(PostgreSQL範例)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: esg-postgres
  labels:
    app: esg-postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: esg-postgres
  template:
    metadata:
      labels:
        app: esg-postgres
    spec:
      containers:
      - name: postgres
        image: postgres:13
        ports:
        - containerPort: 5432
        env:
        - name: POSTGRES_DB
          value: "esgdb"
        - name: POSTGRES_USER
          value: "user"
        - name: POSTGRES_PASSWORD
          valueFrom:
            secretKeyRef:
              name: esg-db-secret
              key: postgres-password
        volumeMounts:
        - mountPath: /var/lib/postgresql/data
          name: postgres-storage
      volumes:
      - name: postgres-storage
        persistentVolumeClaim:
          claimName: postgres-pvc

4. Ingress(配置域名及HTTP訪問)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: esg-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: esg-school-system.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: esg-frontend
            port:
              number: 80
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: esg-backend
            port:
              number: 3000

3. 說明

  • Deployment: 部署後端和前端應用,確保高可用性和擴展性。
  • PersistentVolumeClaim (PVC): 用來持久化存儲資料庫數據。
  • Service: 對外暴露後端和前端應用,讓它們可以被外部訪問。
  • Ingress: 配置域名並將流量路由到相應的服務。

1. 後端部署 (esg-backend)

這部分負責將後端應用(例如使用Node.js)部署到Kubernetes集群中。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: esg-backend
  labels:
    app: esg-backend
spec:
  replicas: 2
  selector:
    matchLabels:
      app: esg-backend
  template:
    metadata:
      labels:
        app: esg-backend
    spec:
      containers:
      - name: esg-backend
        image: your-dockerhub-account/esg-backend:latest
        ports:
        - containerPort: 3000
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: esg-db-secret
              key: database-url
  • apiVersion: 表示資源的API版本,這裡是 apps/v1,適用於 Deployment
  • kind: 定義資源的類型,這裡是 Deployment,用於部署和管理無狀態的應用程式。
  • metadata: 包含資源的名稱 (esg-backend) 和標籤 (labels),標籤用來分類和識別不同的資源。
  • spec: 定義了 Deployment 的規格:
    • replicas: 定義部署多少個副本,這裡有2個後端應用副本,確保高可用性。
    • selector: 定義選擇器,用來匹配 Pod 標籤,這裡指定 app: esg-backend
    • template: 用來描述 Pod 模板的內容:
      • containers: 定義容器的細節:
        • name: 容器名稱,這裡為 esg-backend
        • image: 指定要使用的容器映像,這裡是 your-dockerhub-account/esg-backend:latest,這需要您在Docker Hub上已有此映像。
        • ports: 容器內開放的端口,這裡是 3000,對應後端服務的應用端口。
        • env: 定義環境變數,這裡將使用 DATABASE_URL 來指定資料庫連接字串,並從Kubernetes的 Secret 資源中提取此值。

2. 前端部署 (esg-frontend)

這部分用來部署前端應用,假設使用React或Vue.js。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: esg-frontend
  labels:
    app: esg-frontend
spec:
  replicas: 2
  selector:
    matchLabels:
      app: esg-frontend
  template:
    metadata:
      labels:
        app: esg-frontend
    spec:
      containers:
      - name: esg-frontend
        image: your-dockerhub-account/esg-frontend:latest
        ports:
        - containerPort: 80
  • apiVersion, kind, metadata, spec: 這些部分和 esg-backend 部署的結構類似。
  • replicas: 部署兩個副本以確保前端的高可用性。
  • containerPort: 前端應用開放端口為80,這是典型的Web應用服務端口。

3. 資料庫部署(PostgreSQL)

這部分部署一個 PostgreSQL 資料庫來存儲學校的ESG數據。使用PersistentVolumeClaim來持久化存儲,保證資料庫數據在Pod重啟後依然存在。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

PersistentVolumeClaim (PVC)

  • PersistentVolumeClaim (PVC): 用來請求和管理持久性存儲。
  • accessModes: 定義PVC的存取模式,ReadWriteOnce 表示這個卷可以被單個節點以讀寫模式掛載。
  • resources: 指定所需的存儲空間,這裡請求了 5GiB

接著是 PostgreSQL 的部署:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: esg-postgres
  labels:
    app: esg-postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: esg-postgres
  template:
    metadata:
      labels:
        app: esg-postgres
    spec:
      containers:
      - name: postgres
        image: postgres:13
        ports:
        - containerPort: 5432
        env:
        - name: POSTGRES_DB
          value: "esgdb"
        - name: POSTGRES_USER
          value: "user"
        - name: POSTGRES_PASSWORD
          valueFrom:
            secretKeyRef:
              name: esg-db-secret
              key: postgres-password
        volumeMounts:
        - mountPath: /var/lib/postgresql/data
          name: postgres-storage
      volumes:
      - name: postgres-storage
        persistentVolumeClaim:
          claimName: postgres-pvc
  • image: 使用 postgres:13 映像來部署 PostgreSQL 13 資料庫。
  • ports: 容器開放的端口為 5432,這是PostgreSQL預設的服務端口。
  • env: 配置環境變數來初始化資料庫:
    • POSTGRES_DB: 指定資料庫名稱為 esgdb
    • POSTGRES_USER: 資料庫用戶名。
    • POSTGRES_PASSWORD: 資料庫密碼,通過 Secret 資源獲取,增加了安全性。
  • volumeMounts: 將PVC掛載到 /var/lib/postgresql/data 以持久化存儲資料庫數據。

4. Ingress 設置

Ingress負責路由外部的HTTP/HTTPS流量到內部的前端和後端服務。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: esg-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: esg-school-system.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: esg-frontend
            port:
              number: 80
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: esg-backend
            port:
              number: 3000
  • Ingress: Kubernetes中的Ingress資源負責將外部請求根據路徑或域名轉發到內部服務。
  • annotations: Nginx的Ingress控制器用來重寫URL的目標。
  • rules: 定義了HTTP請求的路由規則:
    • host: 指定域名 esg-school-system.example.com
    • paths:
      • / 路徑被路由到 esg-frontend 服務,前端應用。
      • /api 路徑被路由到 esg-backend 服務,後端API。

這是一個基於Kubernetes的學校ESG資料庫管理系統,通過多個部署檔案來設定前端、後端和資料庫服務。系統包含前端應用(如React或Vue)、後端應用(如Node.js),以及PostgreSQL資料庫,並且使用PersistentVolumeClaim來確保資料持久性。Ingress負責將外部的HTTP/HTTPS請求路由到對應的前後端服務。整個系統利用Kubernetes的部署特性實現可擴展性和高可用性這兩個特性。


上一篇
day 10 k8s 戶口資料資料庫管理系統
下一篇
day 12 K8s住戶個人資料庫管理系統
系列文
K8s 資料庫管理系統15
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言